<?php

namespace App\Http\Controllers\Home\Cart\Api;

use App\Model\Gprice;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\Session;

/**
 * @descr   作用:购物车Api类
 * Class CartApi
 * @author liuguansheng
 * @package App\Http\Controllers\Home\Cart\Api
 */
class CartApi extends Controller
{

	/**
	 * 添加到购物车的方法
	 * @param $gid 商品表商品id
	 * @param $pid 商品价格表商品id
	 * @param $itemNum 加入购物车商品的数量
	 * @return bool 返回加入购物车结果
	 */
	public function addToCart($gid, $pid, $itemNum)
	{

		//用户---未登录---时执行真区间,否则执行假区间
		if (!Session::has('home_user')) {
			//首先查询redis中有没有数据,没有的话就进入真区间查询数据库
			if (!Redis::hexists("hotData","hotData:{$gid}")) {
				$goodsInfo =DB::table('goods_price as gp')
					->select(['g.gname','gp.id','gp.price', 'gp.storage', 'size', 'color', 'discount_price','gp.state','g.pic'])
					->leftJoin('goods as g','g.id','=','gp.gid')
					->where('gp.id','=',$pid)
					->get();
//				Session::flush();
				foreach ($goodsInfo as $item) {
					//准备购物车数组,[pid=>商品详细信息]
					$cartArr = [
						$pid,
						['id'=>$item->id,
							'gname'=>$item->gname,
							'price'=>$item->price,
							'storage'=>$item->storage,
							'size'=>$item->size,
							'color'=>$item->color,
							'discount_price'=>$item->discount_price,
							'state'=>$item->state,
							'pic'=>$item->pic,
						],
						$itemNum,
					];
				}
				dd($cartArr);
				//执行商品加入购物车
				$this->addToSession($cartArr, $pid, $itemNum);
				return true;

			//Redis有数据就执行下面代码,直接取出里面对应的商品信息(数组)
			} else {
				$goodsInfo = json_decode(Redis::hget("hotData","hotData:$gid"));
//				var_dump($goodsInfo);die;
//				Session::flush();
					//准备购物车数组
				foreach ($goodsInfo->goods_price as $item) {
					if ($item->id == $pid  ) {
						$cartArr = [
							$pid,
							['id' => $item->id,
								'price' => $item->price,
								'storage' => $item->storage,
								'size' => $item->size,
								'color' => $item->color,
								'discount_price' => $item->discount_price,
								'state' => $item->state,
							],
							$itemNum,
						];
					}
				}
				$cartArr[1]['pic'] = $goodsInfo->goods->pic;

				$cartArr[1]['gname'] = $goodsInfo->goods->gname;
				//执行商品加入购物车
				$this->addToSession($cartArr, $pid, $itemNum);
				return true;
			}

		} else {

			/*
			 * 用户已登录操作:
			 * 获取用户信息
			 * (获取到的应该是一个集合,待JJ写好登录时,用户数据存入session再说)
			 */

			$uid = Session::get('home_user')['id'];

			//判断---redis---中是否有该用户购物车信息,没有就执行真区间
			if (!Redis::hkeys("userCart:{$uid}") ) {
					// reddis没有购物车信息,查询商品数据库信息,并存入redis,$goodsInfo 是一个集合
					$goodsInfo =DB::table('goods_price as gp')
						->select(['g.gname','gp.id','gp.price', 'gp.storage', 'size', 'color', 'discount_price','gp.state','g.pic'])
						->leftJoin('goods as g','g.id','=','gp.gid')
						->where('gp.id','=',"{$pid}")
						->get()->toArray();

					foreach ($goodsInfo as $item) {
						//准备购物车数组,[pid=>商品详细信息]
						$cartArr = [
							$pid,
							['id'=>$item->id,
								'gname'=>$item->gname,
								'price'=>$item->price,
								'storage'=>$item->storage,
								'size'=>$item->size,
								'color'=>$item->color,
								'discount_price'=>$item->discount_price,
								'state'=>$item->state,
								'pic'=>$item->pic,
							],
							$itemNum,
						];
					}
					//将数据json编码
					$cartToJson = json_encode($cartArr);
					var_dump($cartArr);
					//创建一个新的用户购物车
					$res = Redis::hset("userCart:{$uid}","userCart:{$gid}:{$pid}",$cartToJson);

					//设置键值有效时间30*24*60*60秒
					$validTime = 30*24*60*60;
					$return = Redis::expire("userCart:{$uid}", $validTime);

					//返回处理结果
					return $res;

			//---Redis---有的加就直接加入购物车
			} else {

				//判断该商品在不在---redis---购物车里面,不在就执行真区间
				if ( !Redis::hexists("userCart:{$uid}","userCart:{$gid}:{$pid}") ) {
						echo "不在";
					//在数据库查找该商品信息,并存入redis
					$goodsInfo =DB::table('goods_price as gp')
						->select(['g.gname','gp.id','gp.price', 'gp.storage', 'size', 'color', 'discount_price','gp.state','g.pic'])
						->leftJoin('goods as g','g.id','=','gp.gid')
						->where('gp.id','=',"{$pid}")
						->get()->toArray();
					foreach ($goodsInfo as $item) {
						//准备购物车数组,[pid=>商品详细信息]
						$cartArr = [
							$pid,
							['id'=>$item->id,
								'gname'=>$item->gname,
								'price'=>$item->price,
								'storage'=>$item->storage,
								'size'=>$item->size,
								'color'=>$item->color,
								'discount_price'=>$item->discount_price,
								'state'=>$item->state,
								'pic'=>$item->pic,
							],
							$itemNum,
						];
					}
					var_dump($cartArr);
					//将数据json编码
					$cartToJson = json_encode($cartArr);
					//存入redis 购物车
					$res = Redis::hset("userCart:{$uid}","userCart:{$gid}:{$pid}",$cartToJson);
					//返回处理结果
					return $res;

				//若有该商品,就将该商品从redis的"userCart:{$uid}" 键里面取出并加数量, 再重新压入redis
				} else {
					echo '在';
					//查询商品信息,并解码
					$cartInRedis = json_decode( Redis::hget("userCart:{$uid}","userCart:{$gid}:{$pid}") );
					var_dump($cartInRedis);
					//将新增商品数量加入
					$cartInRedis[2] = $cartInRedis[2]?$itemNum+$cartInRedis[2]:$itemNum;
					//再重新将商品放入购物车
					$cartToJson = json_encode($cartInRedis);
					$res = Redis::hdel("userCart:{$uid}","userCart:{$gid}:{$pid}");
					$res = Redis::hset("userCart:{$uid}","userCart:{$gid}:{$pid}",$cartToJson);
					var_dump($res);
					//返回处理结果
					return $res;
				}
			}

		}
	}


	/**
	 * 显示购物车的方法,查出购物车数据
	 * @return bool|mixed
	 */
	public function showCart()
	{
		/*
		 * 判断用是否登录
		 * 用户--未登录--时执行真区间,否则执行假区间
		 */

		if (!Session::has('home_user')) {

			//判断游客的session是否存在 visitorCart 键,不存在则返回false,
			if (!Session::exists("visitorCart")) {
				return false;
			//存在则查询遍历	
			} else {
				//获取游客购物车数据
				$vcartData = Session::get("visitorCart");
//				dd($vcartData);
				//将数据返回
				return $vcartData;
			}

		//用户已登录
		} else {
			//查询用户id信息
			$uid = Session::get('home_user')['id'];
			//查询Redis是否有该用户购物车信息,有就遍历,没有返回false
			if ( !Redis::hkeys("userCart:{$uid}") ) {
				return false;
			} else {
				//取出所有字段和值的数组
				$redisCart = Redis::hgetall("userCart:{$uid}");
				//准备空数组存放数据;
				$data = [];
				//遍历后放入$data 返回
				foreach ($redisCart as $item) {
					$data[] = json_decode($item,true);
				}

				return $data;
			}
		}
	}

	/**
	 * 添加到session的方法
	 * @param $cartArr  加入购物车的商品信息
	 * @param $pid		 商品价格表id
	 * @param $itemNum  加入购物车的商品数量
	 * @description	这是封装的将商品加入购物车的方法(session的visitorCart键)
	 */
	public function addToSession($cartArr, $pid, $itemNum)
	{
		//判断游客是否第一次添加,是就新增visitorCart键.
		if (!Session::exists("visitorCart")) {
			Session::push("visitorCart", $cartArr);

			//不是第一次添加就判断,是否是之前加过的,加过的就增加数量,没加过的就追加进session的visitorCart键下
		} else {
			//*****取出购物车的商品,并删除购物车在session中的键, 将对购物车数据的操作转换成对数组的操作******
			$vcart = Session::get("visitorCart");

			//默认商品首次加入购物车
			$judge = false;

			//如果商品已存在购物车中,$judge = true;
			foreach ($vcart as $key => $value) {
				if ($value[0] == $pid) {
					$judge = true;
				}
			}
			//商品已存在购物车,增加其数量
			if ($judge) {
				$vcart = Session::pull("visitorCart");
				foreach ($vcart as $key => &$item) {
					if ($item[0] == $pid) {
						$item[2] += $itemNum;
					}
					Session::push("visitorCart", $item);
				}
				//商品首次加入
			} else {
				Session::push("visitorCart", $cartArr);
			}
		}
	}

	/**
	 * 删除购物车商品
	 * @param $gid
	 * @param $pid
	 * @return mixed
	 * @descr 删除购物车某个商品的方法
	 */
	public function rmCart($pid)
	{
		//判断用户登录状态,用户没登录,则删除session里面的数据
		if (!Session::has('home_user')) {
			//取出session里面的购物车内容,找到对应商品删除
			$vcart = Session::pull("visitorCart");
			foreach ($vcart as &$item) {
				if ($item[0] == $pid) {
				    unset($item);
				}
				//重新放入session
				Session::push("visitorCart",$item);
			}
		}else{
			$gidInfo = DB::table('goods_price')->select('gid')->find($pid);	
			$gid = $gidInfo->gid;
			//获取用户登录信息
			$uid = Session::get('home_user')['id'];
			//用户已登录,删除redis的数据
			$res = Redis::hdel("userCart:{$uid}","userCart:{$gid}:{$pid}");
			//返回处理结果
			return $res;
		}
	}

	/**
	 * 清空购物车
	 * @return mixed
	 */
	public function flushCart()
	{
		//判断用户登录状态,用户没登录,则删除session里面的数据
		if (!Session::has('home_user')) {
			//删除session中对应的购物车的键
			$res = Session::remove("visitorCart");
			//返回结果
			return $res;

		}else{
			//获取用户登录信息
			$userinfo = Session::get('home_user');
			foreach ($userinfo as $value) {
				$uid = $value['id'];
			}
			//用户已登录,删除redis的数据
			$res = Redis::del("userCart:{$uid}");
			//返回处理结果
			return $res;
		}
	}

	public function editCart($gid,$pid,$itemNum)
	{
		//判断用户登录状态,用户没登录,则删除session里面的数据
		if (!Session::has('home_user')) {
			$vcart = Session::pull("visitorCart");
			foreach ($vcart as $key=>&$item) {
				if ($item[0] == $pid) {
					$item[2] = $itemNum;
				}
				Session::push("visitorCart",$item);
			}
		}else{
			//获取用户信息
			$userinfo = Session::get('home_user');
			foreach ($userinfo as $value) {
				$uid = $value['id'];
			}
			//查询商品信息,并解码
			$cartInRedis = json_decode( Redis::hget("userCart:{$uid}","userCart:{$gid}:{$pid}") );
			//将商品数量更改
			$cartInRedis[2] = $itemNum;
			//再重新将商品放入购物车
			$cartToJson = json_encode($cartInRedis);
			$res = Redis::hset("userCart:{$uid}","userCart:{$gid}:{$pid}",$cartToJson);
			//返回处理结果
			return $res;
		}
	}

}
